package com.pro.api;

import com.pro.bean.UserInfo;
import com.pro.bean.VipSetmeal;
import com.pro.bean.Vipinfo;
import com.pro.dto.Dto;
import com.pro.service.VipInfoService;
import com.pro.service.VipSetmealService;
import com.pro.util.dtoUtil.DtoUtil;
import com.pro.util.redisUtil.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 提供前端接口，供前端访问
 *当前类为vip_Setmeal控制层
 **/
@RestController
@RequestMapping("vipSetmeal")
public class VipSetmealController {
    //注入VipSetmealService服务层
    @Autowired
    private VipSetmealService vipSetmealService;
    //注入vipInfoService服务层
    @Autowired
    private VipInfoService vipInfoService;
    @Autowired
    private RedisUtil redisUtil;
    /**
     * 查询数据表中所有数据
     * 返回：多条数据List<VipSetmeal>
     * **/
    @GetMapping(value = "all")
    public List<VipSetmeal> all(){
        return vipSetmealService.all();
    }

    /**
     * 根据id查询单个数据
     * 返回：VipSetmeal
     * **/
    @GetMapping("selOne")
    public VipSetmeal selOne(int id){
        return vipSetmealService.selOne(id);
    }

   @PostMapping(value = "add")
    public int add(@RequestBody VipSetmeal vipSetmeal){
        return vipSetmealService.add(vipSetmeal);
   }

   @GetMapping("selVipStatus")
    public Dto selVipStatus(int id){
        return DtoUtil.returnSuccess(vipInfoService.oneVipStatus(id));
   }

    /**
     * 更改权限id
     * **/
    @GetMapping("updPermission")//参数名跟请求过来的参数名称一致
    public Dto updPermission(String token, int id, String vipLevel){
        Calendar rightNow = Calendar.getInstance();//对时间Date进行加减运算操作
        Date date = new Date();
        UserInfo userInfo = new UserInfo();
        //根据前台传送过来的token，到本地数据库查找
        String tokenInfo = redisUtil.getStr(token);
        if(tokenInfo != null){//如果tokenInfo不为空，则判断为用户已经登录
            //如果用户已登录，则查询当前用户的VIP状态。1：不是会员 2：是会员
           int permissionId = vipInfoService.oneVipStatus(id);
           if(permissionId == 1){
               //更改的用户id
               userInfo.setId(id);
               //由于当前需要是更改用户权限为会员，所以2是会员的权限id
               userInfo.setPermissionId(2);
               int successnum = vipSetmealService.updUserPermissionId(userInfo);
               //如果用户权限状态改变，返回1，说明改变成功
               if (successnum == 1){
                   //进入该区域，说明用户已经是vip，对当前用户的vip信息进行添加
                   Vipinfo vipInfo = new Vipinfo();
                   //添加的userId
                   vipInfo.setUserId(id);
                   //添加的是会员等级
                   vipInfo.setVipLevel(vipLevel);
                   //添加的是会员开通时期
                   vipInfo.setVipStartTime(date);
                   //处理会员到期时间
                   if("月会员".equals(vipLevel)){
                       rightNow.setTime(date);//将当前日期放入Calendar类中，方便后期运算
                       rightNow.add(Calendar.MONTH,1);//如果为月会员，则到期时间为当前时间加一个月
                       //会员到期时间。参数为Calendar类做完相应运算的日期
                       vipInfo.setVipEndTime(rightNow.getTime());

                   }else if("季度会员".equals(vipLevel)){
                       rightNow.setTime(date);//将当前日期放入Calendar类中，方便后期运算
                       rightNow.add(Calendar.MONTH,3);//如果为季度会员，则到期时间为当前时间加三个月
                       //会员到期时间。参数为Calendar类做完相应运算的日期
                       vipInfo.setVipEndTime(rightNow.getTime());

                   }else {
                       rightNow.setTime(date);//将当前日期放入Calendar类中，方便后期运算
                       rightNow.add(Calendar.YEAR,1);//如果为年会员，则到期时间为当前时间加一年
                       //会员到期时间。参数为Calendar类做完相应运算的日期
                       vipInfo.setVipEndTime(rightNow.getTime());
                   }
                   //添加权限
                   vipInfo.setVipPermission("全场课程免费");
                   //对VipInfo数据表进行插入相关用户Vip信息
                   int insNum = vipInfoService.insVipUserInfo(vipInfo);
                   if (insNum == 1){
                       Vipinfo vipinfo = vipInfoService.showVipInfo(id);
                       // return 返回成功数据到前台
                       return DtoUtil.returnSuccess(vipinfo);
                   }else {
                       System.out.println("用户相关Vip信息插入失败");
                   }
               }else{
                   System.out.println("用户信息表更改权限id为会员更改失败");
               }
           }else{
               //如果是会员则进入该区域
               //先获取当前用户的VIP相关信息，比如说开始时间，到期时间
               //根据续费的类型（月会员，季度会员，年会员），然后获取到开始时间，进行运算后将到期时间进行修改
               Vipinfo vipinfo = vipInfoService.queryIdStatus(id);
                //获取当前会员的开通时间
               Date vipEndTime = vipinfo.getVipEndTime();
               Vipinfo updVipInfo = new Vipinfo();
               updVipInfo.setVipLevel(vipLevel);
               updVipInfo.setVipPermission("全场课程免费");
               updVipInfo.setUserId(id);
               //如果是月会员进行续费一个月
               if("月会员".equals(vipLevel)){
                   rightNow.setTime(vipEndTime);
                   //续费一个月，并且把值赋给updStatus方法
                   rightNow.add(Calendar.MONTH,1);
                   Date updEndTime = rightNow.getTime();
                   //把当前会员到期时间赋值过来
                   updVipInfo.setVipEndTime(updEndTime);
                   int updNum = vipInfoService.updStatus(updVipInfo);
               }else if("季度会员".equals(vipLevel)){
                   rightNow.setTime(vipEndTime);
                   //续费三个月，并且把值赋给updStatus方法
                   rightNow.add(Calendar.MONTH,3);
                   //把当前会员到期时间赋值过来
                   updVipInfo.setVipEndTime(rightNow.getTime());
                   vipInfoService.updStatus(updVipInfo);
               }else {
                   rightNow.setTime(vipEndTime);
                   //续费一年，并且把值赋给updStatus方法
                   rightNow.add(Calendar.YEAR,1);
                   //把当前会员到期时间赋值过来
                   updVipInfo.setVipEndTime(rightNow.getTime());
                   vipInfoService.updStatus(updVipInfo);
               }
                //对数据库进行更改完成后，查询当前VIP信息返回给前台
               Vipinfo showVipinfo = vipInfoService.showVipInfo(id);
               // return 返回成功数据到前台
               return DtoUtil.returnSuccess(showVipinfo);
           }
        }
        return DtoUtil.returnError(5001,"用户尚未登录，请登录！");
        }

        @GetMapping("queryIdStatus")
        public Dto queryIdStatus(int userId){
            return DtoUtil.returnSuccess(vipInfoService.queryIdStatus(userId));
        }
}